From e50c7df410c921f933c846316b699496c1eb9bb5 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 8 Dec 2005 15:33:10 +0100 Subject: [PATCH] Make balloon driver arch-neutral. Signed-off-by: Dan Magenheimer --- .../drivers/xen/balloon/balloon.c | 13 +++++--- .../include/asm-xen/asm-i386/page.h | 2 ++ .../include/asm-xen/asm-ia64/hypercall.h | 33 ++++++++----------- .../include/asm-xen/asm-ia64/hypervisor.h | 15 +++++++++ .../include/asm-xen/asm-x86_64/page.h | 2 ++ 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c index 15d18e917e..5ffd8a48fa 100644 --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c @@ -192,8 +192,8 @@ static int increase_reservation(unsigned long nr_pages) page = balloon_retrieve(); BUG_ON(page == NULL); - pfn = page - mem_map; - BUG_ON(phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); + pfn = page_to_pfn(page); + BUG_ON(phys_to_machine_mapping_valid(pfn)); /* Update P->M and M->P tables. */ set_phys_to_machine(pfn, mfn_list[i]); @@ -253,8 +253,8 @@ static int decrease_reservation(unsigned long nr_pages) break; } - pfn = page - mem_map; - mfn_list[i] = phys_to_machine_mapping[pfn]; + pfn = page_to_pfn(page); + mfn_list[i] = pfn_to_mfn(pfn); if (!PageHighMem(page)) { v = phys_to_virt(pfn << PAGE_SHIFT); @@ -444,6 +444,9 @@ static int __init balloon_init(void) IPRINTK("Initialising balloon driver.\n"); + if (xen_init() < 0) + return -1; + current_pages = min(xen_start_info->nr_pages, max_pfn); target_pages = current_pages; balloon_low = 0; @@ -465,7 +468,7 @@ static int __init balloon_init(void) /* Initialise the balloon with excess memory space. */ for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) { - page = &mem_map[pfn]; + page = pfn_to_page(pfn); if (!PageReserved(page)) balloon_append(page); } diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h index 4813c6a505..d27891d7a2 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h @@ -65,6 +65,8 @@ extern unsigned long *phys_to_machine_mapping; #define pfn_to_mfn(pfn) \ (phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL<<31)) +#define phys_to_machine_mapping_valid(pfn) \ + (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY) static inline unsigned long mfn_to_pfn(unsigned long mfn) { unsigned long pfn; diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypercall.h b/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypercall.h index fcfd4a5890..e0b41f57ea 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypercall.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypercall.h @@ -355,34 +355,27 @@ HYPERVISOR_multicall( #endif return 1; } +#endif static inline int HYPERVISOR_update_va_mapping( unsigned long va, pte_t new_val, unsigned long flags) { -#if 0 - int ret; - unsigned long ign1, ign2, ign3; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) - : "0" (__HYPERVISOR_update_va_mapping), - "1" (va), "2" ((new_val).pte_low), "3" (flags) - : "memory" ); - - if ( unlikely(ret < 0) ) - { - printk(KERN_ALERT "Failed update VA mapping: %08lx, %08lx, %08lx\n", - va, (new_val).pte_low, flags); - BUG(); - } + /* no-op */ + return 1; +} +static inline int +HYPERVISOR_memory_op( + unsigned int cmd, void *arg) +{ + int ret; + __asm__ __volatile__ ( ";; mov r14=%2 ; mov r15=%3 ; mov r2=%1 ; break 0x1000 ;; mov %0=r8 ;;" + : "=r" (ret) + : "i" (__HYPERVISOR_console_io), "r"(cmd), "r"(arg) + : "r14","r15","r2","r8","memory" ); return ret; -#endif - return 1; } -#endif static inline int HYPERVISOR_event_channel_op( diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypervisor.h b/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypervisor.h index da4303f9b6..494bd5bbde 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypervisor.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypervisor.h @@ -52,4 +52,19 @@ void force_evtchn_callback(void); #define mfn_to_pfn(x) (x) #define machine_to_phys_mapping 0 +// for drivers/xen/balloon/balloon.c +#ifdef CONFIG_XEN_SCRUB_PAGES +#define scrub_pages(_p,_n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT) +#else +#define scrub_pages(_p,_n) ((void)0) +#endif +#define pte_mfn(_x) pte_pfn(_x) +#define INVALID_P2M_ENTRY (~0UL) +#define __pte_ma(_x) ((pte_t) {(_x)}) +#define phys_to_machine_mapping_valid(_x) (1) +#define kmap_flush_unused() do {} while (0) +#define set_phys_to_machine(_x,_y) do {} while (0) +#define xen_machphys_update(_x,_y) do {} while (0) +#define pfn_pte_ma(_x,_y) __pte_ma(0) + #endif /* __HYPERVISOR_H__ */ diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h index d454123723..cd186ea8ff 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h @@ -67,6 +67,8 @@ void copy_page(void *, void *); extern unsigned long *phys_to_machine_mapping; #define pfn_to_mfn(pfn) \ (phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL << 63)) +#define phys_to_machine_mapping_valid(pfn) \ + (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY) static inline unsigned long mfn_to_pfn(unsigned long mfn) { unsigned long pfn; -- 2.30.2